package muhnes.sizoo.publico;

import java.util.List;
import java.util.Arrays;
import java.util.SortedMap;
import java.io.Serializable;
import javax.annotation.PreDestroy;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;  
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;

/**
 * Clase que controla la vista de busquedas
 * @author Ricardo Orellana
 */
@ManagedBean(name = "busquedaBean")
@ViewScoped
public class BusquedaBean implements Serializable{
    
    private DataSource fuenteJndi;
    private Result resultado;
    private List<String> encabezados;
    private List<SortedMap> valores;
    private List<SortedMap> valoresFiltrados;
    private String consulta;
   
    /**
     * Constructor de la clase
     */
    public BusquedaBean() {
    } 

    /**
     * Metodo que cierra la conexion SQL
     *  
     */
    @PreDestroy
    public void cerrarSesion() throws Exception {      
        if( !fuenteJndi.getConnection().isClosed() ) {
            fuenteJndi.getConnection().close();
        }
    }
    
    /**
     * metodo que genera la tabla de resultados
     */
    public void generarTabla() {
        
        try {
		Context ctx = new InitialContext();
		fuenteJndi = (DataSource)ctx.lookup("jdbc/Sizoo");
 
		//get database connection
		Connection con = fuenteJndi.getConnection();
 
		PreparedStatement ps 
			= con.prepareStatement(consulta); 
 
		//get customer data from database
		ResultSet rs =  ps.executeQuery();
                resultado = ResultSupport.toResult(rs);
                
                //Creando encabezados 
                encabezados = Arrays.asList(resultado.getColumnNames());
                valores = Arrays.asList(resultado.getRows());
                
            } catch (NamingException e) {
		e.printStackTrace();
            } catch (SQLException ex) {
                Logger.getLogger(BusquedaBean.class.getName()).log(Level.SEVERE, null, ex);
            }
		
	}

    /**
     * Getter de encabezados
     *  
     */
    public List<String> getEncabezados() {
        return encabezados;
    }

    /**
     * Setter de valores
     *  
     */
    public List<SortedMap> getValores() {
        return valores;
    }
    
    /**
     * Getter de valores filtrados
     *  
     */
    public List<SortedMap> getValoresFiltrados() {
        return valoresFiltrados;
    }
    
    /**
     * Setter de valores filtrados
     *  
     */
    public void setValoresFiltrados( List<SortedMap> valoresFiltrados ) {
        this.valoresFiltrados = valoresFiltrados;
    }
    
    /**
     * Setter de consulta
     *  
     */
    public void setConsulta( String consulta ) {
        this.consulta = consulta;
        generarTabla();
    }
    
    /**
     * Getter de indices
     *  
     */
    public int getIndice( SortedMap registro ) {
        return valores.indexOf(registro);
    }
    
}